package com.lichong;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;

/**
 * @program: 左程云算法
 * @description 本节主要涉及位运算。
 * @author: LiChong
 * @create: 2021-05-28 20:33
 **/
public class Code04 {
    public static void main(String[] args) {
        System.out.println(divide(Integer.MIN_VALUE

                ,2));
    }
    /**
     *使用位运算实现加法
     */
    public static int add(int a,int b){
        int sum = a;
        while(b!=0){
            sum = a ^ b;
            b = (a&b)<<1;
            a = sum;
        }
        return sum;

    }
    /**
     * 使用位运算实现减法
     * @param a
     * @param b
     * @return
     */
    public static  int sub(int a ,int b){
        return add(a,add(~b,1));
    }
    /**
     * 使用位运算实现乘法
     * @param a
     * @param b
     * @return
     */
    public static int multi(int a,int b){
        int res = 0;
        while(b!=0){
            if ((b&1)!=0){
              res=add(res,a);
            }
            b=b>>>1;
            a=a<<1;
        }
        return res;

    }
    /**
     * 使用位运算实现除法
     * @param a
     * @param b
     * @return
     */
    public static int divide(int a,int b){
        if (a==Integer.MIN_VALUE&&b==Integer.MIN_VALUE){
            return 1;
        }else if (b==Integer.MIN_VALUE){
            return 0;
        }else if (a==Integer.MIN_VALUE){
            if (b==1){
                return Integer.MIN_VALUE;
            }else if(b==-1){
                return Integer.MAX_VALUE;
            }
            int aMid = add(a,1);
            int div = div(aMid, b);
            int multi = multi(div, b);
            int reset=add(a,add(~multi,1));
            int div1 = div(reset, b);
            return add(div,div1);
        }
            return div(a,b);

    }
    public static int div(int a,int b){
            int x = a < 0 ? (add(~a, 1)) : a;
            int y = b < 0 ? (add(~b, 1)) : b;
            int res = 0;
            for (int i = 30; i >= 0; i = sub(i, 1)) {
                if ((x >>> i) >= y) {
                    res = res | (1 << i);
                    x = sub(x, y << i);
                }
            }
            return (a < 0) ^ (b < 0) ? (add(~res, 1)) : res;

        }

}
